/**
 * 时间工具库 - 提供常用的时间格式化和处理函数
 */

/**
 * 标准化ISO日期字符串，确保跨平台兼容性
 * @param {string} isoDate - ISO格式的日期字符串
 * @returns {Date} 标准化的Date对象
 */
function normalizeDate(isoDate) {
	// 处理带时区偏移的ISO日期（如2025-06-18T14:35:23+08:00）
	if (isoDate.includes('+') || isoDate.includes('-')) {
		try {
			// 尝试使用原生解析
			const date = new Date(isoDate);
			if (!isNaN(date.getTime())) {
				return date;
			}
		} catch (e) {
			// 解析失败时的备选方案
			const [datePart, timePart] = isoDate.split('T');
			const [time, timezone] = timePart.split(/([+-])/);
			const [hours, minutes, seconds] = time.split(':');

			// 重建带时区的ISO日期字符串
			const normalizedDate = `${datePart}T${hours}:${minutes}:${seconds}${timezone}`;
			return new Date(normalizedDate);
		}
	}

	// 直接使用原生解析
	return new Date(isoDate);
}

/**
 * 将ISO日期字符串转换为相对时间格式（几秒前、几分钟前等）
 * @param {string} isoDate - ISO格式的日期字符串
 * @returns {string} 格式化后的相对时间字符串
 */
export function formatTimeAgo(isoDate) {
	const date = normalizeDate(isoDate);
	const now = new Date();

	// 处理无效日期情况
	if (isNaN(date.getTime())) {
		return '未知时间';
	}

	// 计算时间差（毫秒）
	const diffMs = now.getTime() - date.getTime();

	// 转换为秒、分、小时、天
	const diffSec = Math.floor(diffMs / 1000);
	const diffMin = Math.floor(diffSec / 60);
	const diffHour = Math.floor(diffMin / 60);
	const diffDay = Math.floor(diffHour / 24);
	const diffYear = Math.floor(diffDay / 365); // 简化计算，实际应考虑闰年

	// 优化时间差判断逻辑
	if (diffSec < 10) {
		return '刚刚';
	} else if (diffSec < 60) {
		return `${diffSec}秒前`;
	} else if (diffMin < 60) {
		return `${diffMin}分钟前`;
	} else if (diffHour < 24) {
		return `${diffHour}小时前`;
	} else if (diffDay < 30) {
		return `${diffDay}天前`;
	} else if (diffYear < 1) {
		// 小于1年，显示月-日（M/d）
		return formatLocalDate(isoDate, {
			month: '2-digit',
			day: '2-digit'
		});
	} else {
		// 大于等于1年，显示年-月-日（Y-m-d）
		return formatLocalDate(isoDate, {
			year: 'numeric',
			month: '2-digit',
			day: '2-digit'
		});
	}
}

/**
 * 将ISO日期字符串转换为本地时间格式
 * @param {string} isoDate - ISO格式的日期字符串
 * @param {Object} [options={}] - 格式化选项
 * @returns {string} 格式化后的日期字符串
 */
export function formatLocalDate(isoDate, options = {
	year: 'numeric',
	month: '2-digit',
	day: '2-digit',
	hour: '2-digit',
	minute: '2-digit'
}) {
	const date = normalizeDate(isoDate);
	if (isNaN(date.getTime())) {
		return '无效日期';
	}

	// 手动格式化日期，确保跨平台一致性
	const year = date.getFullYear();
	const month = String(date.getMonth() + 1).padStart(2, '0');
	const day = String(date.getDate()).padStart(2, '0');

	let formatted = '';

	// 按选项拼接日期格式
	if (options.year === 'numeric') {
		formatted += `${year}-`;
	}
	formatted += `${month}-${day}`;
	return formatted;
}


/**
 * 获取两个日期之间的天数差
 * @param {Date|string} date1 - 第一个日期（可以是Date对象或ISO字符串）
 * @param {Date|string} [date2=new Date()] - 第二个日期（默认当前日期）
 * @returns {number} 天数差
 */
export function getDaysDifference(date1, date2 = new Date()) {
	// 统一转换为Date对象
	const dateObj1 = typeof date1 === 'string' ? normalizeDate(date1) : date1;
	const dateObj2 = typeof date2 === 'string' ? normalizeDate(date2) : date2;

	if (isNaN(dateObj1.getTime()) || isNaN(dateObj2.getTime())) {
		return 0;
	}

	const oneDay = 24 * 60 * 60 * 1000; // 一天的毫秒数
	return Math.round(Math.abs((dateObj1.getTime() - dateObj2.getTime()) / oneDay));
}